package xiangmu.schoolpaper.context;

import java.util.Map;
import java.util.HashMap;

/**
 * BaseContext 线程上下文工具类
 * 使用 ThreadLocal 存储每个线程独立的上下文信息（如 userId、roleId 等）。
 * 这样可以避免多线程环境下的变量混乱问题，保证线程安全。
 */
public class BaseContext {

    /**
     * ThreadLocal 保存一个 Map（键值对形式存储上下文数据）
     * - 每个线程都会有一个独立的 Map
     * - 初始值通过 ThreadLocal.withInitial(HashMap::new) 创建一个空的 HashMap
     */
    private static final ThreadLocal<Map<String, Object>> context = ThreadLocal.withInitial(HashMap::new);

    /**
     * 向当前线程的上下文中存放一个键值对
     * @param key   存储的键（如 "userId", "roleId"）
     * @param value 存储的值
     * 创建示例       BaseContext.set("userId", userId);
     */
    public static void set(String key, Object value) {
        context.get().put(key, value);
    }

    /**
     * 从当前线程的上下文中获取值
     * @param key 要获取的键
     * @return 对应的值（Object 类型，可自行强转）
     * 取值示例       Long uid =  (Long) BaseContext.get("userId");
     */
    public static Object get(String key) {
        return context.get().get(key);
    }

    /**
     * 移除当前线程的上下文，防止内存泄漏
     * （建议在请求结束后调用，例如拦截器的 afterCompletion 阶段）
     */
    public static void remove() {
        context.remove();
    }
}